私はMVC 5アプリケーションでOAuth2認証を実装しているので、Androidアプリで使用できます。しかし、Oauth2やトークン認証を使用することはなかったので、どのようになっているのかは分かりません。OAuth2でMVC5からクライアントIDとクライアントシークレットを取得する方法は?
OwinContextExtensions.cs
public static class OwinContextExtensions
{
public static string GetUserId(this IOwinContext ctx)
{
var result = "-1";
var claim = ctx.Authentication.User.Claims.FirstOrDefault(c => c.Type == "UserID");
if (claim != null)
{
result = claim.Value;
}
return result;
}
}
Startup.Auth.cs
public partial class Startup
{
public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }
static Startup()
{
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/token"),
Provider = new OAuthAppProvider(),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(2),
AllowInsecureHttp = true
};
}
public void ConfigureAuth(IAppBuilder app)
{
app.UseOAuthBearerTokens(OAuthOptions);
}
}
OAuthAppProvider.cs
public class OAuthAppProvider : OAuthAuthorizationServerProvider
{
private ProtokolEntities db = new ProtokolEntities();
public IFormsAuthenticationService FormsService { get; set; }
public IMembershipService MembershipService { get; set; }
public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
if (MembershipService == null) { MembershipService = new AccountMembershipService(); }
return Task.Factory.StartNew(() =>
{
var username = context.UserName;
var password = context.Password;
var userID = db.aspnet_Users.Where(x => x.UserName == username).SingleOrDefault().UserId.ToString();
if (MembershipService.ValidateUser(username, password))
{
var claims = new List<Claim>()
{
new Claim(ClaimTypes.Name, username),
new Claim("UserID", userID)
};
ClaimsIdentity oAutIdentity = new ClaimsIdentity(claims, Startup.OAuthOptions.AuthenticationType);
context.Validated(new AuthenticationTicket(oAutIdentity, new AuthenticationProperties() { }));
}
else
{
context.SetError("invalid_grant", "Error");
}
});
}
public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
if (context.ClientId == null)
{
context.Validated();
}
return Task.FromResult<object>(null);
}
}
スタートアップ:
は、これまでのところ私はMVCでfolowingコードを実装しました.cs.cs私はポストマンを開き、http://localhost:1076/tokenにPOSTメソッドを使用する場合
[assembly: OwinStartup(typeof(PageOffice.Startup))]
namespace PageOffice
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
ConfigureAuth(app);
}
}
}
、私はボディ開く - 生>と
grant_typeを書く=パスワード&パスワード= mypasswordを&ユーザ名= myusernameと指定
後私はこれを結果として得る:
{
"access_token": "QmmWSh4OZPfC8uv-jyzFzZx1KP05T8b09QlPP3Cy-_Zr9qvWtzWpxNTXOhc4U387N6VHNCnIPklgTEk8CISMyXlcsWAz7MxlRN8qI_Ajg8gjEphHUS1SrO0uDRG2XRqtX1gvTVupym_1xtsdjlwj2VXoc6ySvR0ihb2YjuXnSd4CNgKKaMBQLb1w8P1XB13jc4Pc5tump4-Y4dYn3A5hpvtc9fqpgVAUjZFdiJ_HXMiIpgmqdIFim0Ty8oRZolzpm3RSMPRV6ZIpZBqHG1A2kcdWN-52ZkHuL4_7U743vW0",
"token_type": "bearer",
"expires_in": 172799
}
「クライアントID」と「クライアントシークレット」はどのようにして分かりますか? また、私は実際にどのように私はアンドロイドでこのaccess_tokenを使用するとわかりませんthisチュートリアルの説明は十分でしょうか?これだけのコードの読み取りと気の毒ため
感謝:) RFCについてOAuth2 for native applicationsはあり
おかげで、私は今、正しい道の上にいます。私は間違ったリンクを送ったが、今は修正されている。私はこのチュートリアルが助けになると思います。 –
@Jan Halasa、 あなたが言いましたように、クライアントと秘密は、アプリケーションreg.assume中に取得することができます私のクライアントは、私のコードでクライアントIDと秘密をハードコアする必要がありますか?または、SQLに格納し、ハードコードされた値と比較する必要がありますか? – Jayendran