请参阅此decision template,以便为我的应用选择正确的授权类型。 我不太确定,使用哪种授权类型。
方案如下:
基本上我想要的是,我的MVC应用程序的所有登录用户都可以使用Bearer Auth立即从客户端浏览器直接向资源服务器发出ajax请求。
访问令牌所有者将是浏览器用户代理,它将访问令牌存储在本地存储中,例如,对吗?每个登录用户都拥有自己的身份验证令牌。 MVC应用程序的客户端(浏览器)是"第一方"客户,对吗?
最后会有什么样的授权类型 - >密码授予?
答案 0 :(得分:1)
密码的grant_type为"密码"它自我。例如,从我的应用程序中获取此示例:
JAVASCRIPT - 使用带有OAuth2.0和c#WebAPI 2.0(MVC)的角度的Auth服务 - 使用的模式。
return $http({
url: $rootScope.globals.apiPath + "/someController/token",
method: 'POST',
data: "userName=" + encodeURIComponent(username) +
"&password=" + encodeURIComponent(password) +
"&Scope=" + "website" +
"&grant_type=password" + // here I pass the type as password to the web api
"&client_id=clientIdExample",
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
然后使用授权资源所有者凭据在API上处理,如下所示:
C# - API
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
var source = LogUtility.InitializeContext(this.GetType());
try
{
var allowedOrigin = context.OwinContext.Get<String>("clientAllowedOrigin") ?? "*";
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { allowedOrigin });
var signOnContext = await new AccessControlBusinessLogicLayer().LoadUserSignOnContextOrDefaultByCredentials(context.Options.AuthenticationType, context.UserName, context.Password);
if (signOnContext == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect.");
return;
}
context.OwinContext.Set<String>("userSecurityStamp", signOnContext.SecurityStamp);
var authenticationProperties = new AuthenticationProperties(
new Dictionary<String, String>
{
{ "client_id", context.ClientId }
});
var authenticationTicket = new AuthenticationTicket(signOnContext.Identity, authenticationProperties);
if (context.Scope[0].ToLower() == "website")
{
using (var userContext = new AccessControlContext())
{
using (var userManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>(
var user = AccessBL.LoadUserOrDefaultByUserName(context.UserName);
var userId = user.Id;
}
}
}
context.Validated(authenticationTicket);
}
catch (Exception exception)
{
throw exception;
}
}
这将检查授权和当前用户的当前上下文。希望这有助于模糊。这意味着密码授予将是来自Web客户端的授权资源,而不是隐式资源。